#ifndef B2D_COLOR_H
#define B2D_COLOR_H

#include "Prerequisites.h"


NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Color defined as 4 floating point values
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API Color final
{
public:
	static const Color White;
	static const Color Black;
	static const Color Red;
	static const Color Green;
	static const Color Blue;
	static const Color Transparent;

public:
	float r, g, b, a;

public:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Default constructor.
	/// 		Initialise color to (0, 0, 0, 0)
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Color(void);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Constructor.
	///
	/// \param	r	Red component.
	/// \param	g	Alpha Component.
	/// \param	b	Blue component.
	/// \param	a	Alpha component (1 by default).
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Color(float r, float g, float b, float a = 1.0f);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Equality operator.
	///
	/// \param	c	Target color to compare.
	///
	/// \return	True if all the components are equal.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator == (const Color& c) const;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Inequality operator.
	/// 		
	/// \param	c	Target color to compare.
	///
	/// \return	True if all the components are not equal.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator != (const Color& c) const;

	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Array indexer operator (constant).
	///
	/// \param	i	Zero-based index of the component.
	///
	/// \return	The component value.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	float operator [] (size_t i) const;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Array indexer operator.
	///
	/// \param	i	Zero-based index of the component.
	///
	/// \return	The component value.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	float& operator [] (size_t i);


	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the pointer to the data (constant).
	///
	/// \return	Pointer to array of color components
	////////////////////////////////////////////////////////////////////////////////////////////////////
	const float* getPtr(void) const;
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the pointer to the data.
	///
	/// \return	Pointer to array of color components
	////////////////////////////////////////////////////////////////////////////////////////////////////
	float* getPtr(void);

	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets.
	///
	/// \param	r	Red component.
	/// \param	g	Alpha Component.
	/// \param	b	Blue component.
	/// \param	a	Alpha component (1 by default).
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void set(float r, float g, float b, float a = 1.0f);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Set individual components with values ranging from 0 to 255.
	///
	/// \param	r	Red component.
	/// \param	g	Alpha Component.
	/// \param	b	Blue component.
	/// \param	a	Alpha component (255 by default).
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void set(uint8 r, uint8 g, uint8 b, uint8 a = 0xFF);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Set RGBA color components from 32 bit integer, each
	/// 		component takes 8 bits.
	///
	/// \param	rgba	The integer representation of the color
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setRGBA(uint32 rgba);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Get integer representation of the RGBA color as, each
	/// 		component takes up 8 bits.
	///
	/// \return	The integer representation of this color.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	uint32 getRGBA(void) const;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the red component.
	///
	/// \param	r	The red value [0 to 1].
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setRed(float r) { this->r = r; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the green component.
	///
	/// \param	r	The green value [0 to 1].
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setGreen(float g) { this->g = g; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the blue component.
	///
	/// \param	r	The blue value [0 to 1].
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setBlue(float b) { this->b = b; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the alpha component.
	///
	/// \param	r	The alpha value [0 to 1].
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setAlpha(float a) { this->a = a; }
};

NS_B2D_END

#endif